package com.adingxiong.ribbon;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 *   hystrix 断路器 作用有
 *   1. 降级 : 超时,出错,不可达的时候 对服务进行降级 返回错误信息或者缓存数据
 *   2. 熔断: 当服务压力过大的时候  错误比例比较多 熔断所有的请求 对服务进行直接降级
 *
 *   可以使用@SpringCloudApplication注解代替三个注解
 */


/*@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker*/
@SpringCloudApplication
@Slf4j
public class RibbonApplication {

    /**  ribbon   1.  负载均衡   多个服务时候 每次调用服务名称不同  但是关掉一个服务的时候 会继续调用挂的服务然后出现报错
     *
     *   解决这个问题的时候 我们需要使用 ribbon的重试机制  当集群服务挂掉一个  请求失败不会继续请求
     *
     * 当修改负载均衡的模式为 轮询的时候  RestTemplate调用的时候 之前的ip地址换成 spring-application 取的名字
     * @return
     */


    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate(){
        SimpleClientHttpRequestFactory  simple = new SimpleClientHttpRequestFactory();
        //设置重试的超时时间  和设置重新连接的时间
        simple.setReadTimeout(1000);
        simple.setConnectTimeout(1000);
        return new RestTemplate();
    }

    public static void main(String[] args) throws UnknownHostException {
        SpringApplication app = new SpringApplication(RibbonApplication.class);
        Environment env = app.run(args).getEnvironment();

        String protocol = "http";
        log.info("\n----------------------------------------------------------\n\t" +
                        "Application '{}' is running! Access URLs:\n\t" +
                        "Local: \t\t{}://localhost:{}\n\t" +
                        "External: \t{}://{}:{}\n\t" +
                        "Profile(s): \t{}\n----------------------------------------------------------",
                env.getProperty("spring.application.name"),
                protocol,
                env.getProperty("server.port"),
                protocol,
                InetAddress.getLocalHost().getHostAddress(),
                env.getProperty("server.port"),
                env.getActiveProfiles());
    }

}
